package com.jzl.leetcode.everyday.everyday2347;
//最好的扑克手牌
//
//给你一个整数数组ranks和一个字符数组suit。你有5张扑克牌，第i张牌大小为ranks[i]，花色为suits[i]。
//
//        下述是从好到坏你可能持有的 手牌类型：
//
//        "Flush"：同花，五张相同花色的扑克牌。
//        "Three of a Kind"：三条，有 3 张大小相同的扑克牌。
//        "Pair"：对子，两张大小一样的扑克牌。
//        "High Card"：高牌，五张大小互不相同的扑克牌。
//        请你返回一个字符串，表示给定的 5 张牌中，你能组成的 最好手牌类型。
//
//        注意：返回的字符串大小写需与题目描述相同。
//
//        
//
//        示例 1：
//
//        输入：ranks = [13,2,3,1,9], suits = ["a","a","a","a","a"]
//        输出："Flush"
//        解释：5 张扑克牌的花色相同，所以返回 "Flush" 。
//        示例 2：
//
//        输入：ranks = [4,4,2,4,4], suits = ["d","a","a","b","c"]
//        输出："Three of a Kind"
//        解释：第一、二和四张牌组成三张相同大小的扑克牌，所以得到 "Three of a Kind" 。
//        注意我们也可以得到 "Pair" ，但是 "Three of a Kind" 是更好的手牌类型。
//        有其他的 3 张牌也可以组成 "Three of a Kind" 手牌类型。
//        示例 3：
//
//        输入：ranks = [10,10,2,12,9], suits = ["a","b","c","a","d"]
//        输出："Pair"
//        解释：第一和第二张牌大小相同，所以得到 "Pair" 。
//        我们无法得到 "Flush" 或者 "Three of a Kind" 。
//        
//
//        提示：
//
//        ranks.length == suits.length == 5
//        1 <= ranks[i] <= 13
//        'a' <= suits[i] <= 'd'
//        任意两张扑克牌不会同时有相同的大小和花色。
//
//        来源：力扣（LeetCode）
//        链接：https://leetcode.cn/problems/best-poker-hand
//        著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

import java.util.HashMap;
import java.util.Map;

public class BestHand {
    public String bestHand(int[] ranks, char[] suits) {
        // 判断花色是否相同
        int i = 0;
        for (; i < suits.length - 1; i++) {
            if (suits[i] != suits[i + 1]) {
                break;
            }
        }
        if (i == suits.length - 1) {
            return "Flush";
        }

        // 判断三条
        Map<Integer, Integer> kingMap = new HashMap<>(ranks.length);
        for (int rank : ranks) {
            Integer rankTimes = kingMap.get(rank);
            if (rankTimes == null) {
                kingMap.put(rank, 1);
            } else {
                kingMap.put(rank, ++rankTimes);
                if (rankTimes >= 3) {
                    return "Three of a Kind";
                }
            }
        }

        // 判断对子
        boolean havePair = kingMap.values().stream().anyMatch(times -> times.equals(2));
        if (havePair) {
            return "Pair";
        } else {
            return "High Card";
        }
    }

    public static void main(String[] args) {
        int[] ranks = {10, 10, 2, 12, 9};
        char[] suits = {'a','b','c','a','d'};
        BestHand bestHand = new BestHand();
        bestHand.bestHand(ranks, suits);
    }
}
